package com.cy.sys.service.impl;

import java.util.List;

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import com.cy.common.exception.ServiceException;
import com.cy.common.pojo.CheckBox;
import com.cy.common.pojo.SysPage;
import com.cy.common.pojo.SysRoleMenu;
import com.cy.common.util.ShiroUtil;
import com.cy.sys.dao.SysRoleDao;
import com.cy.sys.dao.SysRoleMenuDao;
import com.cy.sys.dao.SysUserRoleDao;
import com.cy.sys.pojo.SysRole;
import com.cy.sys.service.SysRoleService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
/**
 * 此类实现了角色模块所有业务逻辑代码
 * @author private
 *
 */
@Service
public class SysRoleServiceImpl implements SysRoleService {
	@Autowired
	private SysRoleDao sysRoleDao;
	@Autowired
	private SysRoleMenuDao sysRoleMenuDao;
	@Autowired
	private SysUserRoleDao sysUserRoleDao;
	
	/** 封装及查询分页数据,使用PageHelper */
	@RequiresPermissions("sys:role:view")
	@Override
	public SysPage<SysRole> doFindPageObjects(String name,Integer pageCurrent,Integer pageSize) {
		//1.进行参数校验
		if(pageCurrent==null||pageCurrent<1)
			throw new IllegalArgumentException("请求的页码面不存在!");
		if(pageSize==null||pageSize<5)
			throw new IllegalArgumentException("显示条数不合法!");
		//2.使用PageHelper计算分页并返回分页对象
		Page<SysRole> startPage = PageHelper.startPage(pageCurrent, pageSize);
		List<SysRole> records = sysRoleDao.selectPageObjects(name);
		return new SysPage<>(pageCurrent, (int)startPage.getTotal(), pageSize, startPage.getPages(), records);
	}

	/** 添加角色同时赋予角色授权 */
	@RequiresPermissions("sys:role:add")
	@Override
	public int doSaveObject(SysRole sysRole, Integer[] menuIds) {
		//1.参数校验
		if(sysRole==null)
			throw new IllegalArgumentException("请为要添加的角色写入信息!");
		if(sysRole.getName()==null)
			throw new IllegalArgumentException("请输入角色名称!");
		if(menuIds==null||menuIds.length<1)
			throw new IllegalArgumentException("请为角色至少赋予1个权限!");
		//2.先添加角色信息
		sysRole.setCreatedUser(ShiroUtil.getUserName());
		int rows = sysRoleDao.insertObject(sysRole);
		if(rows==0) throw new ServiceException("未知错误,添加角色信息失败!");
		//3.为角色与菜单建立关系
		int rmRows = sysRoleMenuDao.insertObjectsByMenuId(sysRole.getId(), menuIds);
		if(rmRows==0)
			throw new ServiceException("未知错误,关联授权关系失败!");
		//4.返回结果
		return rows;
	}

	/** 查询指定id的角色信息及其对应的菜单id */
	@RequiresPermissions("sys:role:view")
	@Override
	public SysRoleMenu doFindObjectById(Integer id) {
		//1.进行参数校验
		if(id==null || id<1)
			throw new IllegalArgumentException("请先选择要修改的角色!");
		//2.进行数据的查询
		SysRoleMenu sysRoleMenu = sysRoleDao.selectObjectById(id);
		System.out.println(sysRoleMenu);
		return sysRoleMenu;
	}

	/** 修改指定id的用户角色信息 */
	@RequiresPermissions("sys:role:update")
	@Transactional(rollbackFor = Exception.class)
	@Override
	public int doUpdateObject(SysRole sysRole, Integer[] menuIds) {
		//1.进行参数的校验
		if(sysRole==null)
			throw new IllegalArgumentException("请填写修改后的数据信息");
		if(sysRole.getId()==null||sysRole.getId()<1)
			throw new IllegalArgumentException("要修改的角色信息无效");
		if(StringUtils.isEmpty(sysRole.getName()))
			throw new IllegalArgumentException("请输入角色名称后进行保存");
		if(menuIds==null||menuIds.length<1)
			throw new IllegalArgumentException("请至少选择一项授权信息!");
		//2.进行角色信息的修改
		sysRole.setModifiedUser(ShiroUtil.getUserName());
		int rows = sysRoleDao.updateObjectById(sysRole);
		if(rows==0)
			throw new ServiceException("此条记录可能已经不存在!");
		//3.进行关系数据的修改
		sysRoleMenuDao.deleteObjectByRoleId(sysRole.getId());
		sysRoleMenuDao.insertObjectsByMenuId(sysRole.getId(), menuIds);
		return rows;
	}

	/** 删除指定id的角色信息 */
	@RequiresPermissions("sys:role:delete")
	@Transactional(rollbackFor = Exception.class)
	@Override
	public int doDeleteObject(Integer id) {
		//1.进行参数的校验
		if(id==null||id<1)
			throw new IllegalArgumentException("选择的角色信息无效!");
		//2.先删除与user用户的关系数据
		sysUserRoleDao.deleteObjectsByRoleId(id);
		//3.再删除与menu菜单的关系数据
		sysRoleMenuDao.deleteObjectByRoleId(id);
		//4.最后删除自身角色信息
		int rows = sysRoleDao.deleteObjectById(id);
		if(rows==0)
			throw new ServiceException("删除失败,角色可能已经不存在!");
		//5.返回结果给调用方
		return rows;
	}

	/** 查询多选框需要的数据 */
	@Override
	public List<CheckBox> doFindRoles() {
		return sysRoleDao.doFindCheckBox();
	}

}
